#include "widget_funca_smart_chat.h"
#include "ui_widget_funca_smart_chat.h"

Widget_funcA_Smart_chat::Widget_funcA_Smart_chat(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget_funcA_Smart_chat)
{
    ui->setupUi(this);
    // 设定标题
    this->setWindowTitle("小欢的人工智能");
    this->setWindowIcon(QIcon(":/img/Luffy.png"));

    manager = new QNetworkAccessManager(this);


}

Widget_funcA_Smart_chat::~Widget_funcA_Smart_chat()
{
    delete ui;
}

void Widget_funcA_Smart_chat::generate(const QString &prompt)
{
    QUrl url("http://127.0.0.1:11434/api/generate");//定义 API URL。
    QNetworkRequest request(url);//创建网络请求对象
    //设置请求头为 JSON 格式。
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");

    QJsonObject body;//创建 JSON 对象用于存储请求体数据。
    // 不同模型用不同的命令 指定模型名称
    body["model"] = "deepseek-r1:1.5b";
    body["prompt"] = prompt;// 设置提示文本
    body["stream"] = true; // 启用流式传输
    body["max_tokens"] = 512;// 设置最大返回 token 数

    QByteArray data = QJsonDocument(body).toJson();//将 JSON 对象转换为字节数组。
    QNetworkReply *reply = manager->post(request, data);//发送 POST 请求
    //在输出框中添加前缀
    ui->textEdit_output->setText(ui->textEdit_output->toPlainText() +  "\nDeepSeek : ");
    //当有数据可读时触发的槽函数。
    connect(reply, &QNetworkReply::readyRead, this, [=]() {
        while (reply->canReadLine()) { // 循环读取每行数据。
            QByteArray chunk = reply->readLine();
            //解析 JSON 数据。
            QJsonDocument doc = QJsonDocument::fromJson(chunk);
            // 检查 JSON 是否有效且包含 response 字段。
            if (!doc.isNull() && doc.object().contains("response")) {
                QString result = doc.object()["response"].toString();//获取 response 内容
                qDebug() << "Chunk received:" << result;//输出调试信息
                // 将结果写入到界面
                ui->textEdit_output->setText(ui->textEdit_output->toPlainText() +  result);
            }
        }
    });

    ui->textEdit_output->setText(ui->textEdit_output->toPlainText() + "\n");
    // 当请求完成时触发的槽函数
    connect(reply, &QNetworkReply::finished, this, [=]() {
        reply->deleteLater(); // 请求完成后删除回复对象。
    });
}

// 处理网络请求的响应
void Widget_funcA_Smart_chat::handleResponse(QNetworkReply *reply)
{
    // 检查是否有错误
    if (reply->error() != QNetworkReply::NoError) {
        qDebug() << "Error:" << reply->errorString();
        return;
    }
    // 读取所有响应数据
    QByteArray response = reply->readAll();
    // 解析 JSON 文档
    QJsonDocument doc = QJsonDocument::fromJson(response);
    QJsonObject json = doc.object();//获取 JSON 对象。
    // 检查是否包含 response 字段
    if (json.contains("response")) {
        QString result = json["response"].toString();// 获取 response 内容
        qDebug() << "Response:" << result;// 输出响应内容
    }
}


void Widget_funcA_Smart_chat::on_Button_send_clicked()
{
    // 获取问题
    QString text_send = ui->textEdit_input->toPlainText();

    // 清空对话框
    ui->textEdit_input->clear();

    // 将问题写入到界面

    // ui->textEdit_output->setFont(QFont());
    ui->textEdit_output->setText(ui->textEdit_output->toPlainText() + "\n小欢 : ");
    ui->textEdit_output->setText(ui->textEdit_output->toPlainText() + text_send);
    ui->textEdit_output->setText(ui->textEdit_output->toPlainText() + "\n");

    // 发送问题
    this->generate(text_send);

}
